package com.devMode.StrategyMode;

import java.util.Random;

/**
 * 策略模式
 * 定义一系列算法，并使它们可以互换，任意算法可以在任意客户端执行
 *
 * 先定义一个算法族（接口），都是实现behavior()，
 * 不同的策略有不同的behavior实现，并封装成一个类
 *
 */
public class StrategyMode {
    public static void main(String[] args) throws InterruptedException {
        Duck duck = new Duck();
        QuackBehaivor[] quackBehaivors = new QuackBehaivor[2];
        quackBehaivors[0] = new Quack();
        quackBehaivors[1] = new SQuack();
        while(true){
            Random random = new Random();
            duck.setQuackBehaivor(quackBehaivors[random.nextInt()&(0x1)]);
            duck.performQuack();
            Thread.sleep(500);
        }
    }
}

interface QuackBehaivor{
    void quack();
}

class Quack implements QuackBehaivor{


    @Override
    public void quack() {
        System.out.println("quack!!");
    }
}

class SQuack implements QuackBehaivor{

    @Override
    public void quack() {
        System.out.println("Squack!!");
    }
}

class Duck{
    /**
     * 策略
     */
    private QuackBehaivor quackBehaivor;

    public void performQuack(){
        if(quackBehaivor!=null){
            quackBehaivor.quack();
        }
    }

    public void setQuackBehaivor(QuackBehaivor quackBehaivor){
        this.quackBehaivor = quackBehaivor;
    }

}
